home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 130_01 / dpatch.c < prev    next >
Text File  |  1985-03-09  |  3KB  |  169 lines

  1. /*
  2.     Disk Patcher
  3.  
  4.     written for BDS "C" v1.3, 1.44 by
  5.     Rick Hollinbeck
  6.     Box C
  7.     Norwood, CO  81423
  8. */
  9.  
  10. #include <a:bdscio.h>
  11. #include <diskio.dcl>
  12.  
  13. #define SD_MAXTRK 76
  14. #define SD_MAXSEC 26
  15. #define DD_MAXTRK 76
  16. #define DD_MAXSEC 52
  17. #define DS_MAXTRK 153
  18. #define DS_MAXSEC 52
  19.  
  20. int maxtrk, maxsec;
  21. struct dskadr dadr;
  22. int trk, sec;
  23. char dbuf[128];
  24. char cmd, ans[132];
  25. int ncmd,modloc,modval;
  26.  
  27. main()
  28. {
  29.  puts("Disk Patch Utility");
  30.  puts(" v1.2\n");
  31.  
  32. getdsk:
  33.  puts("Enter Drive (A:, B:): ");
  34.  gets(ans);
  35.  bios(SELDSK, toupper(ans[0]) - 'A');
  36.  
  37.  printf("\nEnter type of disk [SD, DD, DS]: ");
  38.  gets(ans);
  39.  if (strcmp(ans, "SD") == 0) {
  40.     maxtrk = SD_MAXTRK;
  41.     maxsec = SD_MAXSEC;
  42.  }
  43.  else if (strcmp(ans, "DD") == 0) {
  44.     maxtrk = DD_MAXTRK;
  45.     maxsec = DD_MAXSEC;
  46.  }
  47.  else if (strcmp(ans, "DS") == 0) {
  48.     maxtrk = DS_MAXTRK;
  49.     maxsec = DS_MAXSEC;
  50.  }
  51.  else {
  52.     puts("\nTry Again.");
  53.     goto getdsk;
  54.  }
  55.  
  56.   /* Sector select loop */
  57.  
  58. sec_select:
  59.  while (1)
  60.  {
  61.    printf("\nEnter track, sector: ");
  62.    gets(ans);
  63.  
  64. trksec:
  65.    if (sscanf(ans,"%d,%d",&trk,&sec) != 2) goto sec_select;
  66.    dadr.track = trk;
  67.    dadr.sector = sec;
  68.  
  69. rdnxt:
  70.    puts(CLEARS);
  71.    printf("\nTrack %u, Sector %u\n\n", dadr.track, dadr.sector);
  72.    diskio(READ, &dadr, &dbuf, 1, maxtrk, maxsec);
  73.  
  74.    dmpbuf(dbuf);
  75.  
  76. /* command loop */
  77.  
  78.    while (1)
  79.     {
  80.      puts("\nCommand [M xx,yy; W; D; E]: ");
  81.      gets(ans);
  82.      if (strlen(ans) == 0) goto rdnxt;
  83.      if (isdigit(ans[0]))  /* Take a plain number pair as a new trk,sec */
  84.     goto trksec;
  85.      ncmd = sscanf(ans,"%c%x,%x", &cmd, &modloc, &modval);
  86.  
  87.      switch (toupper(cmd))
  88.       {
  89.        case 'M':
  90.  
  91.       /* Modify buffer */
  92.  
  93.     if (ncmd != 3) {
  94.      puts("Illegal Modify Command");
  95.      break;
  96.     }
  97.         dbuf[modloc & 0x7f] = modval;
  98.         break;
  99.  
  100.        case 'W':
  101.  
  102.       /* Write the buffer */
  103.  
  104.         dec_dskadr(&dadr, maxsec);  /* offset diskio's increment */
  105.         diskio(WRITE, &dadr, &dbuf, 1, maxtrk, maxsec);
  106.  
  107.        case 'E':
  108.  
  109.       /* Exit to sector select level */
  110.  
  111.         goto sec_select;
  112.  
  113.        case 'D':
  114.  
  115.       /* Display dbuf */
  116.  
  117.         dmpbuf(dbuf);
  118.     break;
  119.  
  120.        default:
  121.     puts("What?");
  122.    }
  123.   }
  124.  }
  125. }
  126.  
  127. dmpbuf(buf)
  128. char buf[];
  129. {
  130.   char i, j, *bufp, *bufp1;
  131.  
  132.   bufp = dbuf;
  133.   for (i=0; i<8; ++i)
  134.    {
  135.     printf("\n%c0: ", hexd(i));
  136.     bufp1 = bufp;
  137.     for (j=0; j<16; ++j)
  138.     {
  139.      printf("%c%c ", hexd(*bufp>>4),
  140.                      hexd(*bufp & 0x0f));
  141.      ++bufp;
  142.     }
  143.     printf(" |");
  144.     bufp = bufp1;
  145.     for (j=0; j<16; ++j) {
  146.     putchar( printable(*bufp) ? *bufp : '_');
  147.     ++bufp;
  148.     }
  149.     printf("|");
  150.    }
  151. }
  152.  
  153. char hexd(dbyte)
  154. char dbyte;
  155. {
  156.   return
  157.     ( ((dbyte = dbyte & 0x0f) > 9) ? (dbyte + ('A'-10)) :
  158.                                    (dbyte + '0') );
  159. }
  160.  
  161. char printable(chr)
  162. char chr;
  163. {
  164.  if (chr & 0x80) return 0;
  165.  if (chr < ' ') return 0;
  166.  if (chr == 0x7f) return 0;
  167.  return 1;
  168. }
  169.